/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package viewer;

import java.util.ArrayList;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import model.Flights;

/**
 *
 * @author Дмитрий
 */

/**
 * Класс реализующий поиск по всем полям
 * @version 1.0
 */

public class Search {

    public static final int searchSize = 6;
    private Vector<String> vect;

    /**
     * Поиск вхождений по всем полям
     * @param allFlights Все полеты
     * @param text искомый текст
     * @return ArrayList<String> Список подсказок
     */
    public ArrayList<String> search(Flights allFlights, String text) {
        ArrayList<String> arr = new ArrayList<String>();
        ArrayList<String> arr2 = new ArrayList<String>();

        String[] s = text.split(" ");

        allFlights = searchFirst(allFlights, text);
        if (text.contains(" ")) {
            text = text.substring(0, text.lastIndexOf(" "));
        }

        arr = searchLast(allFlights, s[s.length - 1]);
        if (s.length > 1) {
            for (String x : arr) {
                //if (!text.contains(x))
                arr2.add(text + " " + x);
            }
            return arr2;
        } else {
            return arr;
        }
    }
    /**
     * Поиск вхождений по всем полям
     * @param allFlights Все полеты
     * @param text искомый текст
     * @return Flights Полеты, удовлетворяющие запросу поиска
     */
    public Flights searchFirst(Flights allFlights, String text) {

        text = normalize(text);
        Flights tempFlights;
        String temp = text;
        String[] s = text.split(" ");

        for (int i = 0; i < s.length; i++) {
            ArrayList<String> arr = new ArrayList<String>();
            tempFlights = new Flights();
            temp = s[i];
            temp = temp.trim();
            Pattern p = Pattern.compile(temp.toLowerCase(), Pattern.CASE_INSENSITIVE);
            int j = 0;
            while (j < allFlights.getSize()) {
                vect = Convertor.ToVector(allFlights.getFlightByIndex(j));
                int k = 0;
                boolean flag = true;
                while ((k < vect.size()) && (flag)) {
                    Matcher m = p.matcher(vect.get(k).toLowerCase());
                    if (m.find()) {
                        flag = false;
                        tempFlights.addFlight(allFlights.getFlightByIndex(j));
                    }
                    k++;
                }
                j++;
            }
            allFlights = tempFlights;
        }
        return allFlights;
    }
    /**
     * Поиск вхождений по всем полям
     * @param allFlights Полеты, удовлетворяющие запросу поиска
     * @param text искомый текст
     * @return ArrayList<String> Список подсказок
     */
    public ArrayList searchLast(Flights allFlights, String text) {
        text = normalize(text);
        Pattern p = Pattern.compile(text,
                Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
        ArrayList<String> arr = new ArrayList<String>();
        int i = 0;
        int j = 0;
        while ((i < allFlights.getSize()) && (j < searchSize)) {
            vect = Convertor.ToVector(allFlights.getFlightByIndex(i));
            for (String x : vect) {
                Matcher m = p.matcher(x);
                if (m.find()) {
                    arr.add(x);
                    j++;
                }
            }
            i++;
        }
        return arr;
    }
    /**
     * Приведение к виду, пригодному для поиска
     * @param text искомый текст
     * @return String нормализованный текст
     */
    public String normalize(String text) {

        text = text.replace("*", ".+");
        text = text.replace('?', '.');
        text = text.replace("(", "");
        text = text.replace(")", "");
        text = text.replace("/", " ");
        return text.trim();
    }
}
